package top.tangyh.lamp.care.service;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.web.multipart.MultipartFile;
import top.tangyh.basic.base.service.SuperService;
import top.tangyh.lamp.care.entity.BGenItem;
import top.tangyh.lamp.care.vo.query.GenItemQueryParam;
import top.tangyh.lamp.care.vo.result.GenItemDto;
import top.tangyh.lamp.care.vo.result.PageOutputDTO;
import top.tangyh.lamp.care.vo.save.*;
import top.tangyh.lamp.care.vo.update.BGenItemUpdateVO;
import top.tangyh.lamp.care.vo.result.BGenItemResultVO;
import top.tangyh.lamp.care.vo.query.BGenItemPageQuery;
import top.tangyh.lamp.common.constant.CommonConstant;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;


/**
 * <p>
 * 业务接口
 * 通用项目配置表
 * </p>
 *
 * @author zqb
 * @date 2024-07-17 17:16:35
 * @create [2024-07-17 17:16:35] [zqb] [代码生成器生成]
 */
public interface BGenItemService extends SuperService<Long, BGenItem> {

    PageOutputDTO<GenItemDto> queryPage(GenItemQueryParam param);

    List<BGenItem> queryAll(GenItemQueryParam param);

    default GenItemDto insertOrUpdate(GenItemSaveParam param, boolean isGloble) {
        param.setIsSys(1);
        param.setPatientIdent(null);
        param.setHospitalNumber(null);
        return insertOrUpdate(param);
    }

    GenItemDto insertOrUpdate(GenItemSaveParam param);

    Long manualInsertByInOutModule(ManulGenItemDto manulGenItemDto);

    /**
     * 获得指定模块、指定病人的配置项目
     *
     * @param modeCode     模块编号
     * @param patientIdent 病人识别号
     * @return
     */
    LinkedHashMap<String, BGenItem> queryAllByPid(String modeCode, String patientIdent);

    /**
     * 新增或保存存病人配置
     *
     * @param param    保存参数
     * @param isGloble 是否通用配置，true--是，false--否
     */
    void insertOrUpdate(List<GenItemSaveParam> param, boolean isGloble);

    void importExcel(MultipartFile file);

    void quickcreate(GenItemQuickSaveParam param);

    void quickdelete(GenItemQuickDeleteParam param);

    /**
     * 获得指定模块、指定病人,指定项目的配置项目
     *
     * @param modeCode     模块编号
     * @param itemCode 项目编号
     * @return
     */
    List<BGenItem> queryItemByPidAndCode(String modeCode,String itemCode,String patientIdent);

    /**
     * 根据项目名称查询可非删除数据
     *
     * @param modelCode 模块编号
     * @param itemName  配置项名称
     * @return
     */
    default BGenItem queryOneByNameNoDel(String modelCode, String itemName) {
        List<BGenItem> list = queryByNameNoDel(modelCode, itemName);
        if (CollectionUtil.isEmpty(list)) {
            return null;
        }
        return list.get(0);

    }

    /**
     * 根据项目名称查询可非删除数据
     *
     * @param modelCode 模块编号
     * @param itemName  配置项名称
     * @return
     */
//    default List<BGenItem> queryByNameNoDel(String modelCode, String itemName) {
//        if (StrUtil.isBlank(modelCode) || StrUtil.isBlank(itemName)) {
//            return null;
//        }
//        LambdaQueryWrapper<BGenItem> wrapper = new LambdaQueryWrapper<>();
//        wrapper.eq(BGenItem::getModelCode, modelCode);
//        wrapper.eq(BGenItem::getItemName, itemName);
//        wrapper.eq(BGenItem::getIsDeleted, CommonConstant.NO_NUMBER);
//        wrapper.orderByDesc(BGenItem::getUpdatedTime);
//        return this.selectList(wrapper);
//
//    }
    List<BGenItem> queryByNameNoDel(String modelCode, String itemName);


    /**
     * 获得指定模块、指定病人
     *
     * @param modeCode     模块编号
     * @return
     */
    List<BGenItem> queryItemByPid(String modeCode,String patientIdent);


    /**
     * 根据项目名称查询可非删除数据
     *
     * @param modelCode 模块编号
     * @param itemName  配置项名称
     * @return
     */
    default List<BGenItem> queryByNameNoDelAll(String modelCode, Set<String> itemName) {
        if (StrUtil.isBlank(modelCode) || CollectionUtil.isNotEmpty(itemName)) {
            return null;
        }
        LambdaQueryWrapper<BGenItem> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(BGenItem::getModelCode, modelCode);
        wrapper.in(BGenItem::getItemName, itemName);
        wrapper.eq(BGenItem::getIsDeleted, CommonConstant.NO_NUMBER);
        wrapper.orderByDesc(BGenItem::getUpdatedTime);
        return this.list(wrapper);
    }
    
    
}


